package cn.bbs.ba.html;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;

import cn.bbs.ba.base.PPCodeDTO;
import cn.bbs.ba.exception.BAException;
import cn.bbs.ba.format.ZZZFormat;
import cn.bbs.ba.log.LogTrac;
import cn.bbs.ba.session.SessionDto;
import cn.bbs.ba.session.SessionFactory;

/**
 * zzz 页面方法实体类
 * 
 * @version 2.1 2011-07-23
 * @author source_zzz@126.com
 */
public class ZZZJspContextServices {
	
	/**
	 * 日志分类标识
	 */
	public static final String LOG_ID = "LianaHTML";
	/**
	 * URL的分隔符
	 */
	private static final String URL_SEPERATOR = "/";
	/**
	 * 异常：session已超时
	 */
	private static final BAException EXCEPTION_SESSION_TIMEOUT = new BAException("用户会话已超时" );
	/**
	 * 异常：无法取得Context
	 */
	private static final BAException EXCEPTION_CONTEXT_NOT_FOUND = new BAException("无法取得Context" );
	/**
	 * 当前交易Context
	 */
	private SessionFactory itsContext;
	/**
	 * 当前SessionContext
	 */
	private SessionFactory itsSessionContext;
	/**
	 * 当前web应用的Context
	 */
	private String itsWebContext;
	/**
	 * 当前请求
	 */
	protected static HttpServletRequest itsRequest;

	/**
	 * 初始化
	 * 
	 * @param request
	 *            HttpServletRequest
	 * @param response
	 *            HttpServletResponse
	 * @throws BAException
	 */
	public void initialize( HttpServletRequest request, HttpServletResponse response ) throws BAException
	{
		itsRequest = request;
//		SessionFactory SessionFactory = (SessionFactory) request.getAttribute( EMPConstance.ATTR_CONTEXT );
		SessionDto sessionDto = SessionFactory.getSessionDto(request);
		if ( sessionDto == null )
		{
			throw EXCEPTION_CONTEXT_NOT_FOUND;
		}
		// 为防止HTML和javascript注入进行字符串过滤
//		if ( enableFilter() )
//		{
//			LianaStringFilter.filterHtmlTagFromKeyedCollection( (KeyedCollection) this.itsContext.getDataElement() );
//		}
//		if ( SessionFactory.getName().endsWith( "SessionCtx" ) )
//		{
//			itsSessionContext = SessionFactory;
//		}
//		else
//		{
//			itsSessionContext = SessionFactory.getParent();
//		}
//		if ( itsSessionContext == null )
//		{
//			throw EXCEPTION_SESSION_TIMEOUT;
//		}
		this.itsWebContext = request.getContextPath() + URL_SEPERATOR;
	}
	/**
	 * 初始化
	 * 
	 * @param request
	 *            HttpServletRequest
	 * @param response
	 *            HttpServletResponse
	 * @throws BAException
	 */
	public void initializeP( HttpServletRequest request, HttpServletResponse response ) throws BAException
	{
		itsRequest = request;
////		SessionFactory SessionFactory = (SessionFactory) request.getAttribute( EMPConstance.ATTR_CONTEXT );
//		SessionDto sessionDto = SessionFactory.getSessionDto(request);
//		if ( sessionDto == null )
//		{
//			throw EXCEPTION_CONTEXT_NOT_FOUND;
//		}
		this.itsWebContext = request.getContextPath() + URL_SEPERATOR;
	}
	/**
	 * 是否启用HTML和javascript注入字符串过滤
	 * 
	 * @return
	 */
//	private boolean enableFilter()
//	{
////		return Boolean.valueOf( LianaStandard.getSelfDefineSettingsValue( LianaConstants.SETTINGS_SCRIPT_FILTER ) ).booleanValue();
//	}

	/**
	 * 从request中获取数据域并做过滤
	 * 
	 * @param key
	 * @return
	 */
	public String get( String key )
	{
		String value = null;
		try {
			String value1 = itsRequest.getParameter(key);
			if (value1 == null) return null;
			//value = new String(value1.getBytes("ISO8859-1"),"UTF-8");
			value = new String(value1.getBytes(itsRequest.getCharacterEncoding()),"UTF-8");
		} catch (Exception e) {
			return null;
		}
//		if ( value != null && enableFilter() )
//		{
//			value = LianaStringFilter.filterHtmlTag( value );
//		}
		return value;
	}

	/**
	 * 取得多语言显示的内容
	 * 
	 * @param value
	 *            中文内容
	 * @return 当前语种对应内容
	 */
	public String getDisplayAt( String value )
	{
		return "";
	}

	/**
	 * 应用参数代码转换（应用参数代码-->显示值）
	 * 
	 * @param appCode
	 *            应用参数代码
	 * @param appValue
	 *            应用参数值
	 * @return String 显示值
	 */
	public String getDisplayAt( String appCode, String appValue )
	{
		return getDisplayAt( appCode, appValue, "z" );
	}

	/**
	 * 应用参数代码转换（应用参数代码-->显示值）
	 * 
	 * @param appCode
	 *            应用参数代码
	 * @param appValue
	 *            应用参数值
	 * @param displayLanguage
	 *            显示语种
	 * @return String 显示值
	 */
	public String getDisplayAt( String appCode, String appValue, String displayLanguage )
	{
		return "";
	}

	/**
	 * 显示错误码对应错误信息
	 * 
	 * @param errorCode
	 *            错误码
	 * @return String
	 */
//	public String getErrorDisplay( String errorCode )
//	{
//		String language = null;
//		try
//		{
//		}
//		catch ( Exception ex )
//		{
//			
//		}
//		return getErrorDisplay( errorCode, language );
//	}

	/**
	 * 显示错误码对应错误信息
	 * 
	 * @param errorCode
	 *            错误码
	 * @param displayLanguage
	 *            显示语种
	 * @return String
	 */
//	public String getErrorDisplay( String errorCode, String displayLanguage )
//	{
//	}

	/**
	 * 取得格式化数字<br>
	 * 示例：getFormatNumber("0.21","#.##%") = "21%"<br>
	 * 
	 * @param number
	 *            格式化前的数字
	 * @param format
	 *            格式
	 * @return String
	 */
	public String getFormatNumber( String number, String format )
	{
		NumberFormat formatter = new DecimalFormat( format );
		return formatter.format( new BigDecimal( number ).floatValue() );
	}

	/**
	 * 获取格式化后的服务器时间
	 * 
	 * @param inputFormat
	 * @return String
	 */
	public String getServerDate( String inputFormat )
	{
		return getServerTime( inputFormat );
	}
	
	/**
	 * 取得格式化的服务器时间
	 * 
	 * @param timeFormat
	 *            时间：yyyyMMddHHmmss；日期：yyyyMMdd
	 * @return String
	 */
	public static String getServerTime( String timeFormat )
	{
		String format = (timeFormat == null) ? ZZZFormat.DEFAULT_TIME_FORMAT_DB : timeFormat;
		Calendar calendar = Calendar.getInstance();
		Date date = calendar.getTime();
		SimpleDateFormat formatter = new SimpleDateFormat( format );
		return formatter.format( date );
	}
	
	/**
	 * 使用一个Map动态生成页面下拉列表框
	 * 
	 * @return 生成的下拉列表框
	 */
	public String getSelectOpt(String strCodeId)
	{
		String strLang = ZPaiConstant.getLanguage();
		List<PPCodeDTO> codeList = ZPaiInit.getCodeMap().get(strCodeId);
		StringBuffer result = new StringBuffer();
		if(codeList == null) {
			return "";
		}
		for (int i = 0; i < codeList.size(); i++)
		{	PPCodeDTO dto = codeList.get(i);
			if (!strLang.equals(dto.getLanguage())) {
				continue;
			}
			result.append( "<option value='" + dto.getSystemId() + "'>" + dto.getCvalue() + "</option>\n" );
		}
		return result.toString();
	}
	
	/**
	 * 得到权限下来列表
	 * 
	 * @return 生成的下拉列表框
	 */
	public String getLevelSelect()
	{
		String strLang = ZPaiConstant.getLanguage();
		List<PPCodeDTO> codeList = ZPaiInit.getCodeMap().get("PK001");
		StringBuffer result = new StringBuffer();
		SessionDto session = SessionFactory.getSessionDto(itsRequest);
		for (int i = 0; i < codeList.size(); i++)
		{	PPCodeDTO dto = codeList.get(i);
			if (!strLang.equals(dto.getLanguage()) || session.getKbn().equals(dto.getSystemId())) {
				continue;
			}
			result.append( "<option value='" + dto.getSystemId() + "'>" + dto.getCvalue() + "</option>\n" );
		}
		return result.toString();
	}

	/**
	 * 取得信息
	 */
	public List<PPCodeDTO> getCodeData(String strCodeId) {
		List<PPCodeDTO> recodeList = new ArrayList<PPCodeDTO>();
		List<PPCodeDTO> codeList = ZPaiInit.getCodeMap().get(strCodeId);
		if (codeList == null) {
			return recodeList;
		}
		String strLang = ZPaiConstant.getLanguage();
		for (int i = 0; i < codeList.size(); i++)
		{	PPCodeDTO dto = codeList.get(i);
			if (!strLang.equals(dto.getLanguage())) {
				continue;
			}
			recodeList.add(dto);
		}
		return recodeList;
	}

	/**
	 * 取得信息
	 */
	public String getCodeValue(String strCodeId, String systemCode) {
		
		List<PPCodeDTO> recodeList = getCodeData(strCodeId);
		
		for (int i = 0; i < recodeList.size(); i ++) {
			if (systemCode.equals(recodeList.get(i).getSystemId())) {
				return recodeList.get(i).getCvalue();
			}
		}
		return "";
	}
	
//	/**
//	 * 根据指定的应用参数代码，生成页面下拉列表框
//	 * 
//	 * @param appCode
//	 *            应用参数代码
//	 * @return String 下拉列表框(HTML)
//	 */
//	public String getSelectOpt( String appCode )
//	{
//		return getSelectOpt( appCode, "" );
//	}

//	/**
//	 * 根据指定的应用参数代码，生成页面下拉列表框，指定的参数值显示为选中状态
//	 * 
//	 * @param appCode
//	 *            应用参数代码
//	 * @param appValue
//	 *            标记为选中的参数值
//	 * @return String 下拉列表框(HTML)
//	 */
//	public String getSelectOpt( String appCode, String appValue )
//	{
//		String language = null;
//		try
//		{
//			language = (String) getSessionContext().getDataValue( LianaConstants.FIELD_LANGUAGE );
//		}
//		catch ( EMPException ex )
//		{
//			language = LianaConstants.ZH_CN;
//		}
//		if ( language == null )
//		{
//			language = LianaConstants.ZH_CN;
//		}
//		return this.getSelectOpt( appCode, appValue, language );
//	}
//
//	public String getSelfDefOption( String appCode, String appValue)
//	{
//		StringBuffer buffer = new StringBuffer( "" );
//		Map map = LianaStandard.getAppCodeHash( appCode, LianaConstants.ZH_CN );
//		if ( map != null )
//		{
//			// 排序用队列
//			Vector sortVector = new Vector();
//			for ( Iterator iterator = map.keySet().iterator(); iterator.hasNext(); )
//			{
//				LianaAppParam param = (LianaAppParam) map.get( iterator.next() );
//				String currentValue = param.getValue();
//				sortVector.add( currentValue );
//			}
//			Collections.sort( sortVector );
//			for ( int i = 0; i < sortVector.size(); i++ )
//			{
//				String value = (String) sortVector.elementAt( i );
//				LianaAppParam param = (LianaAppParam) map.get( value );
//				String message = param.getShowMessage();
//				if ( value.equals( appValue ) )
//				{
//					buffer.append( "<option value=\"" ).append( value ).append( "\" >" );
//					buffer.append( message );
//					buffer.append( "</option>" );
//				}
//			}
//		}
//		return buffer.toString();
//	}



	/**
	 * Method getContext.
	 * 
	 * @return SessionFactory
	 */
	public SessionFactory getContext()
	{
		return itsContext;
	}

	/**
	 * 获取SessionContext
	 * 
	 * @return SessionFactory
	 */
	public SessionFactory getSessionContext()
	{
		return itsSessionContext;
	}

	/**
	 * Method getWebAppPath.
	 * 
	 * @return String
	 */
	public String getWebAppPath()
	{
		return itsWebContext;
	}

	/**
	 * 如果是空值，则以空字符串取代
	 * 
	 * @param dataValue
	 * @return String
	 */
	public String nvl( Object dataValue )
	{
		return nvl( dataValue, "" );
	}

	/**
	 * 如果是空值，则以参数指定字符串取代
	 * 
	 * @param dataValue
	 * @param returnValue
	 * @return String
	 */
	public String nvl( Object dataValue, String returnValue )
	{	
		if (dataValue == null || StringUtils.isEmpty(dataValue.toString())) {
			return returnValue;
		}
		return dataValue.toString();
	}

	/**
	 * 记录日志
	 * 
	 * @param ex
	 */
	protected void log( Exception ex )
	{
		LogTrac.error(ex.toString());
	}

	/**
	 * 格式化金额
	 * 
	 * @param currency
	 *            String
	 * @return String
	 */
	public String getFmtCurrency( String currency )
	{
		return ZZZFormat.formatCurrency( currency );
	}

	/**
	 * 使用默认格式格式化日期
	 * 
	 * @param date
	 * @return String
	 */
	public String getFmtDate( String date )
	{
		return ZZZFormat.formatDate( date, ZZZFormat.DEFAULT_DATE_FORMAT_EN );
	}

	/**
	 * 根据参数格式显示格式化日期
	 * 
	 * @param date
	 * @param format
	 *            String
	 * @return String
	 */
	public String getFmtDate( String date, String format )
	{
		return ZZZFormat.formatDate( date, format );
	}

	/**
	 * 显示中文金额
	 * 
	 * @param money
	 *            带小数点的实际金额字符
	 * @return String
	 */
	public String getChineseCurrency( String money )
	{
		return ZZZFormat.formatChineseCurrency( money );
	}

	/**
	 * 取得若干天前/后的系统日期
	 * 
	 * @param days
	 *            与现在相隔的日数，正数为当前日期之后，负数为当前日期之前
	 * @param timeFormat
	 *            格式化
	 * @return String
	 */
	public String getDifferentDate( int days, String timeFormat )
	{
		return ZZZFormat.getDifferentDate( days, timeFormat );
	}

	/**
	 * 取得指定时间间隔后的系统时间<br>
	 * 示例：<br>
	 * getDifferentTime( 1, 2, 3,"yyyyMMddHHmmss") <br>
	 * 使用yyyyMMddHHmmss格式输出1小时2分3秒后的系统时间<br>
	 * getDifferentTime( -24, 0, 0,"yyyyMMdd") <br>
	 * 使用yyyyMMdd格式输出1天前的系统日期<br>
	 * 
	 * @param hour
	 *            小时
	 * @param minute
	 *            分钟
	 * @param second
	 *            秒
	 * @param timeFormat
	 *            格式化
	 * @return String
	 */
	public String getDifferentTime( int hour, int minute, int second, String timeFormat )
	{
		return ZZZFormat.getDifferentTime( hour, minute, second, timeFormat );
	}

	/**
	 * 向提交的Form中添加必须的数据
	 * 
	 * @param controlSubmit
	 *            是否进行重复提交控制
	 * @return String
	 */
	public String getRequiredHtmlFields( boolean controlSubmit )
	{
		StringBuffer result = new StringBuffer();
		// 根据sessionManager的类型添加需要的数据域
//		SessionManager sessionManager = (SessionManager) itsRequest.getAttribute( EMPConstance.ATTR_SESSION_MGR );
//		result.append( sessionManager.getAppendPostField( itsRequest, LOG_ID ) );
//		// 添加重复提交控制所需的数据域
//		if ( controlSubmit )
//		{
//			result.append( "<input type=\"hidden\" name=\"" ).append( LianaConstants.FIELD_SUBMIT_TIMESTAMP );
//			result.append( "\" value=\"" ).append( LianaStandard.getServerTime( null ) ).append( "\">" );
//		}
		return result.toString();
	}

	/**
	 * 向请求的URL中添加必须的数据
	 * 
	 * @param url
	 *            请求的URL
	 * @return String
	 */
//	public String getURL( String url )
//	{
//		// 根据sessionManager的类型添加需要的数据域
//		SessionManager sessionManager = (SessionManager) itsRequest.getAttribute( EMPConstance.ATTR_SESSION_MGR );
//		return sessionManager.encodeURL( itsRequest, null, url, null );
//	}

	/**
	 * 获取当前sessionId，形如：EMP_SID=HGKLASHGKSHGKSDHJKSAHDF
	 * 
	 * @return String
	 */
//	public String getSessionId()
//	{
//		EMPSessionManager sessionManager = (EMPSessionManager) itsRequest.getAttribute( EMPConstance.ATTR_SESSION_MGR );
//		Session session = (Session) itsRequest.getAttribute( EMPConstance.ATTR_SESSION );
//		return sessionManager.getSessionIdLabel() + '=' + session.getId();
//	}

	/**
	 * 获取输入错误信息
	 * 
	 * @return
	 */
//	public String showInputError()
//	{
//		String result = (String) itsRequest.getAttribute( LianaConstants.INPUT_ERROR_KEY );
//		if ( result == null )
//		{
//			return "";
//		}
//		else
//		{
//			itsRequest.removeAttribute( LianaConstants.INPUT_ERROR_KEY );
//			return result;
//		}
//	}	
	
	/**
	 * 获取毫秒级时间数
	 * 
	 * @param inputFormat
	 * @return String
	 */
	public String getRadomVeiryNum( String time )
	{
		time = ZZZFormat.formatDate(time, "yyyyMMddHHmmss");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		Calendar cal = Calendar.getInstance();
		String seconds = "0000000000";
		try{
			cal.setTime(sdf.parse(time));
			seconds = cal.getTimeInMillis()+"";
		}catch(Exception e){
			e.printStackTrace();
		}
		Random r = new Random();
		r.setSeed(Long.parseLong(seconds));
		return r.nextLong()+"";
	}
	
	/**
	 * 根据参数代码与键获取到参数值
	 * @param accountType
	 * @return
	 */
	public String getMappedValue(String appCode,String mapKey){
		return this.getDisplayAt(appCode, mapKey);
	}
	/**
	 * 根据参数代码与参数值获取到参数键
	 * @param appCode
	 * @param mapValue
	 * @return
	 */
//	public String getMappedKey(String appCode,String mapValue){
//		String language = null;
//		try
//		{
//			language = (String) getSessionContext().getDataValue( LianaConstants.FIELD_LANGUAGE );
//		}
//		catch ( EMPException ex )
//		{
//			language = LianaConstants.ZH_CN;
//		}
//		if ( language == null )
//		{
//			language = LianaConstants.ZH_CN;
//		}
//		Map map = LianaStandard.getAppCodeHash( appCode, language );
//		if ( map != null )
//		{
//			for(Iterator iterator = map.keySet().iterator();iterator.hasNext();){
//				LianaAppParam param = (LianaAppParam)map.get(iterator.next());
//				String value = param.getShowMessage();
//				if(value == null && mapValue == null) return param.getValue();
//				if(value.equals(mapValue)){
//					return param.getValue();
//				}
//			}
//		}
//		
//		return null;
//	}

	/**
	   * 产生随机字符串
	   * */
	private static Random randGen = null;
	private static char[] numbersAndLetters = null;

	public final String randomString(int length) {
         if (length < 1) {
             return null;
         }
         if (randGen == null) {
                randGen = new Random();
                numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz" +
                   "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
                  //numbersAndLetters = ("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
         }
         char [] randBuffer = new char[length];
         for (int i=0; i<randBuffer.length; i++) {
             randBuffer[i] = numbersAndLetters[randGen.nextInt(71)];
          //randBuffer[i] = numbersAndLetters[randGen.nextInt(35)];
         }
         return new String(randBuffer);
	}

}
